home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / shell / taskmana / src / read.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-05  |  9.9 KB  |  451 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <egb.h>
  9. #include <guidbg.h>
  10.  
  11. #include <eintm.h>
  12. //#include <mos.h>
  13. //#define DEBUG
  14. #define ERROR    (-1)
  15. #define LINESIZE (256)
  16. #define MAXCLASS (10)
  17.  
  18. extern int topMenuID[] ;
  19. extern int sourceMenuID ;
  20. extern int sourceMenuItemID ;
  21.  
  22. int readMenuFunc(void);
  23. int init(void);
  24. void end(void);
  25. int attachMenu(void);
  26. int addMenuItem( int );
  27. int nextMenu(void);
  28. int nextLine(void);
  29. int nextWord(void);
  30.  
  31. //    メモリロット
  32. int        memLotID;        //    アプリ終了まで使用
  33. int        tempMemLotID;    //    一時的に使用
  34. //    単語抽出処理用
  35. char    *line;                //一行
  36. char    *buf;                //単語
  37. int        count;                //読み込んだ一行の何文字目か
  38. FILE    *fp;
  39. //    メニュー情報
  40. int        *menuID;            //メニューID
  41. int        *menuParentNum;        //親メニューアイテムの番号
  42. int        *menuXsize;            //メニューのXサイズ
  43. int        *menuYsize;            //メニューのYサイズ
  44. //    メニュー構成用
  45. int        menuNum;            //メニューの数
  46. //    メニューアイテム情報
  47. int        *menuItemID;        //メニューアイテムID
  48. int        *menuItemParentID;    //親メニューアイテムID
  49. char    *menuItemMsg;        //メニューアイテムメッセージ(ロット確保)
  50. int        *menuItemChar;        //メニューアイテムメッセージサイズ(ドット)
  51. //    メニューアイテム構成処理用
  52. int        menuItemNum;        //メニューアイテムの数
  53. int        parentID[MAXCLASS];    //親MenuのID
  54. int        class;                //階層(一番上=0)
  55. //    アプリ情報
  56. int        *apliID;            //アプリに対応するメニューアイテムID(ロット確保)
  57. int        *apliMode;            //アプリMODE(ロット確保)
  58. char    *apliPath;            //アプリパス(ロット確保)
  59. int        *apliSaveFlag;        //アプリ退避フラグ(sub.cで使用)(ロット確保)
  60. //    アプリ構成処理用
  61. int        apliNum;            //アプリメニューの数
  62.  
  63. int        masterMenuID;
  64.  
  65. int readMenuFunc(void)
  66. {
  67.  
  68.     //読み込み開始
  69.     if(init()!=NOERR) return ERROR;
  70.  
  71.     //一番上のメニュー
  72.     masterMenuID = topMenuID[1];
  73.     parentID[0] = masterMenuID;
  74.     #ifdef DEBUG
  75.     printf("master'topMenuID[1]'=%d\n",masterMenuID);
  76.     #endif
  77.     class = 0;
  78.     menuNum = 0;
  79.     menuItemNum = 0;
  80.     apliNum = 0;
  81.     //メニュー構成読み込み・解析
  82.     while(nextWord()==NOERR)
  83.     {
  84.         if(buf!=NULL)
  85.         {
  86.             if(buf[0]==':') nextMenu();
  87.             else
  88.             {
  89.                 addMenuItem(TRUE);
  90.             }
  91.         }
  92.     }
  93.     //メニュー接続
  94.     attachMenu();
  95.  
  96.     //読み込み終了
  97.     end();
  98.  
  99.     return NOERR ;
  100. }
  101.  
  102. int attachMenu(void)
  103. {
  104.     int        i,j;
  105.     int        mx,my;
  106.     int        Xsize,Ysize;
  107.     HYPER    hyp;
  108.     FRAME    fr;
  109.  
  110.     #ifdef DEBUG
  111.     printf("attach:\nmenu=%d\nmenuItem=%d\napli=%d\n",
  112.                                     menuNum,menuItemNum,apliNum);
  113.     #endif
  114.  
  115.     //マスターメニューへの接続と位置設定
  116.     MMI_SendMessage(masterMenuID,MM_GETHYPER,1,&hyp);
  117.     mx=hyp.fr.lupx;
  118.     my=hyp.fr.lupy;
  119.     //子を探す(最大Xサイズ設定)
  120.     Xsize=0;
  121.     for(j=0;j<menuItemNum;j++)
  122.     {
  123.         if(masterMenuID==menuItemParentID[j])
  124.         {
  125.             if(Xsize<menuItemChar[j]) Xsize = menuItemChar[j];
  126.         }
  127.     }
  128.     //子を探す(ATTACH,MOVE処理)
  129.     Ysize=0;
  130.     for(j=0;j<menuItemNum;j++)
  131.     {
  132.         if(masterMenuID==menuItemParentID[j])
  133.         {    //ATTACHする
  134.             MMI_SendMessage(menuItemID[j],MM_ATTACH,1,masterMenuID);
  135.             //移動する
  136.             fr.lupx = mx+1;
  137.             fr.lupy = my+1+Ysize*16;
  138.             fr.rdwx = fr.lupx+Xsize;
  139.             fr.rdwy = fr.lupy+15;
  140.             MMI_SendMessage(menuItemID[j], MM_MOVE, 1, &fr ); 
  141.             ++Ysize;
  142.         }
  143.     }
  144.     //マスターメニュー位置設定
  145.     MMI_SendMessage(masterMenuID,MM_GETHYPER,1,&hyp);
  146.     hyp.fr.rdwx = hyp.fr.lupx+Xsize+4;
  147.     hyp.fr.rdwy = hyp.fr.lupy+Ysize*16+3;
  148.     MMI_SendMessage(masterMenuID,MM_SETHYPER,1,&hyp);
  149.  
  150.     //メニューアイテム接続と位置設定
  151.     for(i=0;i<menuNum;i++)
  152.     {
  153.         MMI_SendMessage(menuID[i],MM_GETHYPER,1,&hyp);
  154.         mx=hyp.fr.lupx;
  155.         my=hyp.fr.lupy;
  156.         //子を探す(最大Xサイズ設定)
  157.         Xsize=0;
  158.         for(j=0;j<menuItemNum;j++)
  159.         {
  160.             if(menuID[i]==menuItemParentID[j])
  161.             {
  162.                 if(Xsize<menuItemChar[j]) Xsize = menuItemChar[j];
  163.             }
  164.         }
  165.         menuXsize[i] = Xsize;
  166.         //子を探す(ATTACH,MOVE処理)
  167.         Ysize=0;
  168.         for(j=0;j<menuItemNum;j++)
  169.         {
  170.             if(menuID[i]==menuItemParentID[j])
  171.             {    //ATTACHする
  172.                 MMI_SendMessage(menuItemID[j],MM_ATTACH,1,menuID[i]);
  173.                 //移動する
  174.                 fr.lupx = mx+1;
  175.                 fr.lupy = my+1+Ysize*16;
  176.                 fr.rdwx = fr.lupx+Xsize;
  177.                 fr.rdwy = fr.lupy+15;
  178.                 MMI_SendMessage(menuItemID[j], MM_MOVE, 1, &fr ); 
  179.                 ++Ysize;
  180.             }
  181.         }
  182.         menuYsize[i] = Ysize*16;
  183.     }
  184.     //メニュー位置設定
  185.     for(i=0;i<menuNum;i++)
  186.     {
  187.         MMI_SendMessage(menuItemParentID[menuParentNum[i]],MM_GETHYPER,1,&hyp);
  188.         fr.lupx = hyp.fr.rdwx;
  189.         MMI_SendMessage(menuItemID[menuParentNum[i]],MM_GETHYPER,1,&hyp);
  190.         fr.lupy = hyp.fr.lupy;
  191.         fr.rdwx = fr.lupx+menuXsize[i]+4;
  192.         fr.rdwy = fr.lupy+menuYsize[i]+3;
  193.         MMI_SendMessage(menuID[i], MM_MOVE, 1, &fr ); 
  194.     }
  195.  
  196.     return NOERR;
  197. }
  198.  
  199. int addMenuItem(int flag)
  200. {
  201.     int i,j;
  202.  
  203.     //新たなメニューアイテムを追加する
  204.     //新IDを創造
  205.     menuItemID[menuItemNum] = MMI_SendMessage(sourceMenuItemID,MM_NEW,0);
  206.     //親IDを登録(attachは後で)
  207.     menuItemParentID[menuItemNum] = parentID[class];
  208.     //メッセージを情報領域に複写して登録
  209.     j=menuItemNum*20;
  210.     if(flag==TRUE)
  211.     {
  212.         for(i=0;buf[i]!='\0';i++)
  213.             menuItemMsg[j+i] = buf[i];
  214.         menuItemMsg[j+i] = '\0';
  215.         menuItemChar[menuItemNum] = i*6+12;
  216.     } else
  217.     {
  218.         for(i=0;buf[i+1]!='\0';i++)
  219.             menuItemMsg[j+i] = buf[i+1];
  220.         menuItemMsg[j+i] = '\0';
  221.         menuItemChar[menuItemNum] = i*6+18;
  222.     }
  223.     MMI_SendMessage(menuItemID[menuItemNum],MM_SETMSG,1,&(menuItemMsg[j]));
  224.  
  225.     #ifdef DEBUG
  226.     printf("%c%d|%d|%s%c",(flag==TRUE ? 'I' : 'G'),
  227.         class,parentID[class],&(menuItemMsg[j]),(flag==TRUE ? '|' : '\n'));
  228.     #endif
  229.  
  230.     if(flag==TRUE)
  231.     {                                                        //アプリの追加
  232.         //アプリに対応するメニューアイテムのIDを保存
  233.         apliID[apliNum] = menuItemID[menuItemNum];
  234.         //アプリのモードを保存
  235.         nextWord();
  236.         apliMode[apliNum] = atoi(buf);
  237.         //アプリのパスを保存
  238.         nextWord();
  239.         j=apliNum*128;
  240.         for(i=0;buf[i]!='\0';i++)
  241.             apliPath[j+i] = buf[i];
  242.         apliPath[j+i] = '\0' ;
  243.  
  244.         #ifdef DEBUG
  245.         printf("%d|%s\n",apliMode[apliNum],&(apliPath[j]));
  246.         #endif
  247.  
  248.         ++apliNum;
  249.     }
  250.  
  251.     ++menuItemNum;
  252.  
  253.     return NOERR;
  254. }
  255.  
  256. int nextMenu(void)
  257. {
  258.     int flag;
  259.  
  260.     //新たなメニューアイテムを追加する
  261.     addMenuItem(FALSE);
  262.  
  263.     ++class;
  264.     //新たなメニューを作る
  265.     //新IDを創造
  266.     menuID[menuNum] = MMI_SendMessage(sourceMenuID,MM_NEW,0);
  267.     parentID[class] = menuID[menuNum] ;
  268.     //親メニューアイテムにattachする
  269.     menuParentNum[menuNum] = menuItemNum-1;
  270.     MMI_SendMessage(menuID[menuNum],MM_ATTACH,1,menuItemID[menuItemNum-1]);
  271.  
  272.     ++menuNum;
  273.  
  274.     nextWord();
  275.     if(buf[0]!='{') return ERROR;
  276.     flag = FALSE;
  277.     do {
  278.         nextWord();
  279.         if(buf[0]==':')
  280.             nextMenu();
  281.         else
  282.             if(buf[0]=='}') flag=TRUE;
  283.             else
  284.                 addMenuItem(TRUE);
  285.     } while(flag==FALSE);
  286.  
  287.     --class;
  288.  
  289.     return NOERR;
  290. }
  291.  
  292. int nextWord(void)
  293. {
  294.     char c;
  295.     int i,flag,flag2;
  296.  
  297.     flag = FALSE;
  298.     do {
  299.         do {
  300.             c=line[count++] ;
  301.         } while(c==' ' || c=='\t' || c==',') ;
  302.  
  303.         if(c=='#' || c=='\n' || c=='\0')
  304.         {
  305.             if(nextLine()==ERROR) return ERROR;
  306.         } else flag = TRUE;
  307.     } while (flag==FALSE);
  308.  
  309.     if(c=='"')
  310.     {
  311.         flag2=TRUE;
  312.         c=line[count++] ;
  313.     } else
  314.         flag2=FALSE;
  315.  
  316.     i=0;
  317.     flag = FALSE;
  318.     do {
  319.         buf[i++] = c ;
  320.         c = line[count++] ;
  321.  
  322.         if(c==' ' || c=='\t' || c==',' || c=='#' || c=='\n' || c=='\0')
  323.         {
  324.             if(c=='\t' && flag2==TRUE)
  325.             {
  326.                 buf[i  ] = ' ';        buf[i+1] = ' ';
  327.                 buf[i+2] = ' ';
  328.                 i += 3;
  329.                 c = ' ';
  330.             } else if(c!=' ' || flag2==FALSE)
  331.             {
  332.                 flag=TRUE;
  333.                 buf[i]='\0';
  334.                 if(c=='#' || c=='\n' || c=='\0') line[count] = '\0';
  335.             }
  336.         }
  337.  
  338.     } while(flag == FALSE);
  339.     if(flag2==TRUE) buf[i-1] = '\0';
  340.  
  341.     return NOERR;
  342. }
  343.  
  344. int nextLine(void)
  345. {
  346.     if(fgets(line,LINESIZE,fp)==NULL)
  347.         return ERROR;
  348.     count = 0;
  349.  
  350.     return NOERR;
  351. }
  352.  
  353. int init(void)
  354. {
  355.     int i;
  356.  
  357.     //メモリロット確保
  358.     memLotID = TL_getLot();
  359.     tempMemLotID = TL_getLot();
  360.  
  361.     //単語抽出処理用バッファ獲得
  362.     if((line = TL_mallocMemory(tempMemLotID,LINESIZE))==NULL) return ERROR;
  363.     if((buf  = TL_mallocMemory(memLotID,LINESIZE))==NULL) return ERROR;
  364.  
  365.     //ファイルオープン
  366.     MMI_CallMessage(MMI_GetApliId(),GM_QUERYID,QM_DIRECTRY,( int )buf );
  367.     for(i=0;buf[i]!='\0';i++) ;
  368.     buf[i   ] = 'T';    buf[i+ 1] = 'A';    buf[i+ 2] = 'S';
  369.     buf[i+ 3] = 'K';    buf[i+ 4] = 'M';    buf[i+ 5] = 'A';
  370.     buf[i+ 6] = 'N';    buf[i+ 7] = 'A';    buf[i+ 8] = '.';
  371.     buf[i+ 9] = 'M';    buf[i+10] = 'N';    buf[i+11] = 'U';
  372.     buf[i+12] = '\0';
  373.     if((fp = EIN_fopen( buf, "rt" ))==NULL)
  374.         return ERROR;
  375.  
  376.     if(nextLine()==ERROR) return ERROR;
  377.  
  378.     //メニュー等の数を数える
  379.     menuItemNum = 0;
  380.     menuNum = 0;
  381.     apliNum = 0;
  382.     while(nextWord()==NOERR)
  383.     {
  384.         if(buf!=NULL)
  385.         {
  386.             if(buf[0]!='{' && buf[0]!='}')
  387.             {
  388.                 for(i=0;buf[i]=='\0';i++) if(buf[i]=='}') return ERROR;
  389.                 ++menuItemNum;
  390.                 if(buf[0]==':') ++menuNum;
  391.                 else
  392.                 {
  393.                     ++apliNum;
  394.                     nextWord();    //モード空読み
  395.                     nextWord();    //パス空読み
  396.                 }
  397.             }
  398.         }
  399.     }
  400.  
  401.     #ifdef DEBUG
  402.     printf("menu=%d\nmenuItem=%d\napli=%d\n",menuNum,menuItemNum,apliNum);
  403.     #endif
  404.  
  405.     if((menuID=(int *)TL_mallocMemory(tempMemLotID,menuNum*4))==NULL)
  406.         return ERROR;
  407.     if((menuParentNum=(int *)TL_mallocMemory(tempMemLotID,menuNum*4))==NULL)
  408.         return ERROR;
  409.     if((menuXsize=(int *)TL_mallocMemory(tempMemLotID,menuNum*4))==NULL)
  410.         return ERROR;
  411.     if((menuYsize=(int *)TL_mallocMemory(tempMemLotID,menuNum*4))==NULL)
  412.         return ERROR;
  413.     if((menuItemID=(int *)TL_mallocMemory(tempMemLotID,menuItemNum*4))==NULL)
  414.         return ERROR;
  415.     if((menuItemParentID=
  416.                     (int *)TL_mallocMemory(tempMemLotID,menuItemNum*4))==NULL)
  417.         return ERROR;
  418.     if((menuItemMsg= TL_mallocMemory(memLotID,menuItemNum*20))==NULL)
  419.         return ERROR;
  420.     if((menuItemChar=
  421.                     (int *)TL_mallocMemory(tempMemLotID,menuItemNum*4))==NULL)
  422.         return ERROR;
  423.     if((apliID=(int *)TL_mallocMemory(memLotID,apliNum*4))==NULL)
  424.         return ERROR;
  425.     if((apliMode=(int *)TL_mallocMemory(memLotID,apliNum*4))==NULL)
  426.         return ERROR;
  427.     if((apliPath=TL_mallocMemory(memLotID,apliNum*128))==NULL)
  428.         return ERROR;
  429.     if((apliSaveFlag=(int *)TL_mallocMemory(memLotID,apliNum*4))==NULL)
  430.         return ERROR;
  431.  
  432.     //巻き戻す
  433.     fseek(fp,0,SEEK_SET);
  434.     //最初の行をセット
  435.     nextLine();
  436.  
  437.     return NOERR;
  438. }
  439.  
  440. void end(void)
  441. {
  442.     //作業用ロット開放
  443.     TL_freeLot( tempMemLotID ); 
  444.  
  445.     //ファイルクローズ
  446.     fclose(fp);
  447.  
  448.     return ;
  449. }
  450.  
  451.